﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.UI.Common;
using Sinacor.UI.Bovespa.Parametro.Model;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Common.Validation;

namespace Sinacor.UI.Bovespa.Parametro.Presenter
{

    public class CadastroParametros : BasePresenter<ICadastroParametro>
    {
        #region Construtor
        private Communication.Correspondente _communicationCorrespondente;
        private Communication.Operador _communicationOperador;
        private Communication.Ordem _communicationOrdens;
        private Communication.Parametro _communicationParametro;
       

        #region Models Private

        private ModelCollection<Model.Correspondente> _listaCorrespondente;


        private ModelCollection<Model.Mensagem> _listaMensagem;


        private ModelCollection<Model.Operador> _listaOperador;


        private Model.Parametro _parametro;


        public bool modificadoConteudo
        {
            get;
            set;
        }

        #endregion


        /// <summary>
        /// Construtor padrão que inicializa View
        /// </summary>
        /// <param name="view">View</param>
            public CadastroParametros(ICadastroParametro view)
            : base(view)
        {
            // Inicialize aqui os comunications e as properties da presenter
            _communicationCorrespondente = new Communication.Correspondente(this.Session);
            _communicationOperador = new Sinacor.UI.Bovespa.Parametro.Communication.Operador(this.Session);
            _communicationOrdens = new Sinacor.UI.Bovespa.Parametro.Communication.Ordem(this.Session);
            _communicationParametro = new Sinacor.UI.Bovespa.Parametro.Communication.Parametro(this.Session); 

            // Inicializando models
            _listaCorrespondente = new ModelCollection<Correspondente>();
            _listaMensagem = new ModelCollection<Mensagem>();
            _listaOperador = new ModelCollection<Operador>();
            _parametro = new Sinacor.UI.Bovespa.Parametro.Model.Parametro(); 
        }
        #endregion

        #region  Models Publica

        public ModelCollection<Model.Correspondente> ListaCorrespondente
        {
            get { return _listaCorrespondente; }
            set { _listaCorrespondente = value; }
        }

        public ModelCollection<Model.Mensagem> ListaMensagem
        {
            get { return _listaMensagem; }
            set { _listaMensagem = value; }
        }

        public ModelCollection<Model.Operador> ListaOperador
        {
            get { return _listaOperador; }
            set { _listaOperador = value; }
        }

        public Model.Parametro Parametro
        {
            get { return _parametro; }
            set { _parametro = value; }
        }

        #endregion

        #region Alterar os Parametros Bovespa
        public void AlterarParametro()
        {
            try
            {
                if (this.View.ConfirmarSalvar())
                {
                    _communicationParametro.AlterarParametro(_parametro);
                    _parametro.ocorreAlteracao = false;
                    this.View.InformarSucessoSalvar();
                    this.View.AtualizaStatusBotao(); 
                    
                }
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
        }
        #endregion

        #region Carregar a Lista de Correspondentes
        public void ConsultarAgenteCompensacao()
        {
            try
            {
                _listaCorrespondente = _communicationCorrespondente.ConsultarCorrespondentes();
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }

        }
        #endregion

        #region Lista de Mensagem Justificativa Observacao
        public void ConsultarMensagensJustificativaObservacao()
        {

            try
            {
                _listaMensagem = _communicationOrdens.ConsultarMensagensJustificativaObservacao();
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
        }
        #endregion

        #region Consultar Operador
        public void ConsultarOperador()
        {
            try
            {
                Model.Parameter.FiltroOperador filtroOperador = new Model.Parameter.FiltroOperador();
                filtroOperador.Bloqueado = false;

                _listaOperador = _communicationOperador.ConsultarOperadores(filtroOperador);
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
        }
        #endregion
        #region inicializacao da presenter

        public void Inicializar()
        {
            ConsultarOperador();
            ConsultarMensagensJustificativaObservacao();
            ConsultarAgenteCompensacao();
            ObterParametro();
            this.View.AtualizarOperador();
            this.View.AtualizarAgenteCompensacao();
            this.View.AtualizarMensagem();
            View.AtualizarMensagemZeComZe();
            this.View.CarregarControle();
            this.View.AtualizaStatusBotao();
            this.Parametro.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(Parametro_PropertyChanged);
            
        }
        #endregion

        private void Parametro_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            _parametro.ocorreAlteracao = true;
                        
        }
        #region Carrregar os Parametros
        private void ObterParametro()
        {
            try
            {
                _parametro = _communicationParametro.ObterParametro();
                

            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
        }
        #endregion
        /// <summary>
        /// Solução temporária 
        /// </summary>
        public void ativarControle()
        {
            this._parametro.ocorreAlteracao = true; 
        }
        #region Desfazer as alteracoes

        public void Desfazer()
        {
            if (this.View.ConfirmarDesfazer())
            {
                ObterParametro();
                this.View.AtualizarOperador();
                this.View.AtualizarAgenteCompensacao();
                this.View.AtualizarMensagem();
                View.AtualizarMensagemZeComZe();
                this.View.CarregarControle();
                this.View.InformarSucessoDesfazer();
                this.View.AtualizaStatusBotao();
                this.Parametro.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(Parametro_PropertyChanged);
            }
        }
        #endregion




        public void RetirarInformacaoObrigatoria()
        {
            this.View.DesativarAgenteCompensacao();
        }

        public void AtivarInformacaoObrigatoria()
        {
            this.View.AtivarAgenteCompensacao();
        }

        public void DesativarInformacaoObrigatoriaAposPeriodo()
        {
            this.View.DesativarDiasCancelamentoOrdem();
        }

        public void AtivarInformacaoObrigatoriaAposPeriodo()
        {
            this.View.AtivarDiasCancelamentoOrdem();
        }
    }
}
